﻿package cocoaas3{

	import jp.progression.casts.*;
	import jp.progression.commands.display.*;
	import jp.progression.commands.lists.*;
	import jp.progression.commands.managers.*;
	import jp.progression.commands.media.*;
	import jp.progression.commands.net.*;
	import jp.progression.commands.tweens.*;
	import jp.progression.commands.*;
	import jp.progression.data.*;
	import jp.progression.events.*;
	import jp.progression.scenes.*;

	import jp.nium.core.debug.Logger;
	import caurina.transitions.Tweener;

	import flash.display.*;
	import flash.geom.*;
	import flash.events.*;

	import cocoaas3.flash.*;

	public class UINavigationController extends UIViewController {

		//
		//-------------------------------------------------------------------------------------------
		// original variables
		//-------------------------------------------------------------------------------------------
		//
		private var _navigationBar:UINavigationBar = new UINavigationBar();
		private var _viewControllers:Vector.<UIViewController> = new Vector.<UIViewController>();
		public function get viewControllers():Vector.<UIViewController>{
			return _viewControllers;
		}

		public function get navigationBar():UINavigationBar{
			return _navigationBar;
		}

		// The view controller at the top of the navigation stack. (read-only)
		public function get topViewController():UIViewController{
			if( viewControllers.length ){
				return viewControllers[viewControllers.length-1];
			} else {
				return null;
			}
		}

		public function set navigationBarHidden( val:Boolean ):void{
			navigationBar.visible = !val;
		}
		public function get navigationBarHidden():Boolean{
			return !navigationBar.visible;
		}

		//
		//-------------------------------------------------------------------------------------------
		// custom functions
		//-------------------------------------------------------------------------------------------
		//



		//
		//-------------------------------------------------------------------------------------------
		// original functions
		//-------------------------------------------------------------------------------------------
		//
		public function UINavigationController( rootViewController:UIViewController, title:String=null ){
			super( title );
			viewControllers.push( rootViewController );
			addScene( rootViewController );

			// ナビバーアイテム表示
			navigationBar.pushNavigationItem( rootViewController.navigationItem, false );
		}

		/**
		 * シーン移動時に目的地がシーンオブジェクト自身もしくは子階層だった場合に、階層が変更された直後に送出されます。
		 * このイベント処理の実行中には、ExecutorObject を使用した非同期処理が行えます。
		 */
		override protected function atSceneLoad():void {
			super.atSceneLoad();
			view.addChild( navigationBar );
		}

		/**
		 * シーンオブジェクト自身が目的地だった場合に、到達した瞬間に送出されます。
		 * このイベント処理の実行中には、ExecutorObject を使用した非同期処理が行えます。
		 */
		override protected function atSceneInit():void {
			super.atSceneInit();

			// 今いるタブと同じタブを押した時の処理
			if( sceneId.contains(manager.departedSceneId) ){
				if( manager.departedSceneId.equals(viewControllers[0].sceneId) ){
					Logger.info( "UINavigationController atSceneInit すでにルートです。" );
					return;
				} else {
					Logger.info("UINavigationController atSceneInit ルートにもどります。");
					popToRootViewController();
					return;
				}
			}

			// 現在の状況を復元
			trace( ">>>>"+ this.navigationBarHidden );
			if( this.navigationBarHidden ){
				topViewController.view.y = 0;
			} else {
				topViewController.view.y = 88;
			}
			topViewController._navigationController = this;
			topViewController._presentingViewController = this.presentingViewController;
			manager.goto( topViewController.sceneId );

		}

		/**
		 * シーンオブジェクト自身が出発地だった場合に、移動を開始した瞬間に送出されます。
		 * このイベント処理の実行中には、ExecutorObject を使用した非同期処理が行えます。
		 */
		override protected function atSceneGoto():void {
			super.atSceneGoto();
		}

		/**
		 * シーン移動時に目的地がシーンオブジェクト自身もしくは親階層だった場合に、階層が変更される直前に送出されます。
		 * このイベント処理の実行中には、ExecutorObject を使用した非同期処理が行えます。
		 */
		override protected function atSceneUnload():void {
			super.atSceneUnload();
			//view.removeChild( navigationBar );
		}


		// ビューが最後まで描画された後やアニメーションが終了した後にこの処理が呼ばれる。
		override public function viewDidAppear():void{
			topViewController.viewDidAppear();
		}






		// Sets whether the navigation bar is hidden.
		public function setNavigationBarHidden( hidden:Boolean, animated:Boolean=true ):void{
			if( hidden ){
				navigationBar.visible = false;
			} else {
				navigationBar.visible = true;
			}
		}

		// viewClassからインスタンスを作成してviewにロード
		override public function loadView():void{
		}

		// レシーバのスタックにビューコントローラをプッシュして表示を更新する。
		public function pushViewController( viewController:UIViewController, animated:Boolean=true ):void{
			//trace("pushViewController");

			// シーンを追加して遷移
			topViewController.addScene( viewController );
			viewController.navigationItem.backBarButtonItem = UINavigationItem.getDefaultBackBarButtonItem();
			viewController.navigationItem.backBarButtonItem.action = function(){
				viewController.navigationController.popViewController();
			};

			// 表示する UIViewController の設定をする
			viewController._navigationController = this;
			viewController._presentingViewController = this.presentingViewController;
			viewController.view.x = manager.stage.stageWidth;

			// 遷移アニメ
			stage.mouseChildren = false;
			var slist = new SerialList();
			slist.addCommand(
				[
					new DoTweener( topViewController.view, {x:0-manager.stage.stageWidth, time:0.33, transition:"easeInOutSine"} ),
					new DoTweener( viewController.view, {x:0, time:0.33, transition:"easeInOutSine"} ),
				],
				new RemoveChild( topViewController.view.parent, topViewController.view ),
				function(){ stage.mouseChildren = true; },
			null);
			slist.execute();

			manager.goto( viewController.sceneId );

			// シーン移動後に判定
			if( this.navigationBarHidden ){
				viewController.view.y = 0;
			} else {
				viewController.view.y = 88;
			}
		
			// ナビゲーションバー更新
			navigationBar.pushNavigationItem( viewController.navigationItem, animated );

			viewControllers.push( viewController );
		}


		public function popViewController( animated:Boolean=true ):void{
			//trace("popViewController");
			var current_vc:UIViewController = viewControllers.pop();


			// 表示する UIViewController の設定をする
			if( this.navigationBarHidden ){
				topViewController.view.y = 0;
			} else {
				topViewController.view.y = 88;
			}
			topViewController.view.x = 0 - manager.stage.stageWidth;

			// 遷移アニメ
			stage.mouseChildren = false;
			var slist = new SerialList();
			slist.addCommand(
				[
					new DoTweener( current_vc.view, {x:manager.stage.stageWidth, time:0.33, transition:"easeInOutSine"} ),
					new DoTweener( topViewController.view, {x:0, time:0.33, transition:"easeInOutSine"} ),
				],
				new RemoveChild( current_vc.view.parent, current_vc.view ),
				function(){ stage.mouseChildren = true; },
			null);
			slist.execute();

			manager.goto( current_vc.parent.sceneId );

			// ナビゲーションバー更新
			navigationBar.popNavigationItem();
		}



		// Pops all the view controllers on the stack except the root view controller and updates the display.
		// TODO: 3階層以上ある場合でも正確に動くようちゃんと実装する
		public function popToRootViewController( animated:Boolean=true ):void{
			Logger.info( this, "popToRootViewController" );
			var root_vc:UIViewController = viewControllers[0];

			manager.goto( root_vc.sceneId );

			// 表示する UIViewController の設定をする
			if( this.navigationBarHidden ){
				root_vc.view.y = 0;
			} else {
				root_vc.view.y = 88;
			}
			
			// 遷移アニメ
			var slist = new SerialList();
			if( animated ){
				stage.mouseChildren = false;
				root_vc.view.x = 0 - manager.stage.stageWidth;
				slist.addCommand(
					[
						new DoTweener( topViewController.view, {x:manager.stage.stageWidth, time:0.33, transition:"easeInOutSine"} ),
						new DoTweener( root_vc.view, {x:0, time:0.33, transition:"easeInOutSine"} ),
					],
				null);
			} else {
				root_vc.view.x = 0;
			}
			slist.addCommand(
				new RemoveChild( topViewController.view.parent, topViewController.view ),
				function(){ stage.mouseChildren = true; },
			null);
			slist.execute();

			// viewControllersをリセット
			_viewControllers = new Vector.<UIViewController>();
			_viewControllers.push( root_vc );

			// ナビゲーションバー更新
			var vec:Vector.<UINavigationItem> = new Vector.<UINavigationItem>();
			vec.push( root_vc.navigationItem );
			navigationBar.setItems( vec, animated );
			
		}
		
		
		






	}
}